package com.ark.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

public class JwtUtil {
    /**
     * 生成jwt
     * 使用Hs256算法，私钥使用固定密钥
     * @param secretKey jwt密钥
     * @param ttlMillis jwt过期时间
     * @param claims 设置的信息
     * @return jwt令牌
     */
    public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
        // 生成jwt的时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        // 设置jwt的body
        return Jwts.builder()
                .expiration(exp)
                .signWith(generateKey(secretKey))
                .claims(claims)
                .compact();
    }

    /**
     * Token解密
     * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
     * @param token 加密后的token
     * @return 解密结果
     */
    public static Claims parseJWT(String secretKey, String token) {
        JwtParser jwtParser = Jwts.parser()
                .verifyWith(generateKey(secretKey))
                .build();
        return jwtParser.parseSignedClaims(token).getPayload();
    }


    /**
     * 生成HMAC密钥,根据提供的字节数组长度选择适当的HMAC算法，并返回响应的SecretKey
     * @param secret 密钥
     * @return SecretKey
     */
    public static SecretKey generateKey(String secret){
        return Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
    }
}
